/**
	\file grid.h
	\author Romain Montero, Yann M Yemvula
	\brief module permettant la gestion de la grille
 */

#ifndef _GRID_H
#define _GRID_H

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "mine.h"

/*! MINE une mine equivaut a -1*/
#define MINE -1

/**
	\struct sGrille
	\brief cree la grille
	
	
 */ 
struct sGrille
{
	/*!  ce champ indique le tableau des cases (cellules)*/
	Case * cases;
	/*! ce champ indique la dimension en x de la grille*/
	int dimx;
	/*! ce champ indique la dimesion en y de la grille */
	int dimy;
	/*! ce champ indique le nombre de mines (bombes) dans la grille de jeu*/
	int nMine;

};
/*!
	cree un type pour sGrille
 */
typedef struct sGrille Grille;

/**
	\brief 
	Fonction: getNMine
	cette fonctionne retourne le nombre des mines dans le jeu
	\fn getNMine(const Grille *jeu)
	\param[in] jeu le jeu
	\return le nombre de mine
 */
int getNMine(const Grille * jeu);

/**
	\brief
	Fonction getDimX
	cette fonction retourne la dimension en x d'une grille
	\fn getDimX(const Grille *jeu)
	\param[in] jeu le jeu
	\return la dimension en x de la grille
 */
int getDimX(const Grille * jeu);

/**
	\brief
	Fonction getDimY
	cette fonction retourne la dimension en y d'une grille
	\fn getDimY(const Grille *jeu)
	\param[in] jeu le jeu
	\return la dimension en y de la grille
 */
int getDimY(const Grille * jeu);

/**
	\brief
	Procedure setMine
	cette procedure modifie une cellule en une mine
	\fn void setMine(Grille *jeu, const int mines)
	\param[in, out] jeu le jeu
	\param[in] mines la mine
	
 */
void setMine(Grille * jeu, const int mines);

/**
	\brief
	Procedure setDimX
	cette procedure modifie la dimension en x de la grille
	\fn setDimX(Grille *jeu, const int dimx)
	\param[in, out] jeu le jeu
	\param[in] dimx la dimension en x
 */
void setDimX(Grille * jeu, const int dimx);

/**
	\brief
	Procedure setDimY
	cette procedure modifie la dimension en y de la grille
	\fn setDimY(Grille *jeu, const int dimy)
	\param[in, out] jeu le jeu
	\param[in] dimy la dimension en y
 */
void setDimY(Grille * jeu, const int dimy);

/**
	\brief 
	Fonction: getCase
	cette fonctionne retourne la case de coordonnees x,y
	\fn getCase(const Grille *jeu, const int x, const int y)
	\param[in] jeu : le jeu
	\param[in] x, y : les coordonnees de la case demandee
	\return la case demandee
 */
Case getCase(const Grille *jeu, const int x, const int y);

/**
	\brief 
	Fonction: getCasePtr
	cette fonctionne retourne un pointeur la case de coordonnees x,y
	\fn getCasePtr(const Grille *jeu, const int x, const int y)
	\param[in] jeu : le jeu
	\param[in] x, y : les coordonnees de la case demandee
	\return un pointeur sur la case demandee
 */
Case* getCasePtr(const Grille *jeu, const int x, const int y);

/**
	\brief
	Procedure initGrille
	cette procedure initialise la grille de jeu
	\fn initGrille(Grille *jeu, const int dimx, const int dimy, const int nmine)
	\param[in, out] jeu le jeu
	\param[in] dimx la dimmension en x
	\param[in] dimy la dimension en y
	\param[in] nmine le nombre de mine
 */
void initGrille(Grille * jeu, const int dimx, const int dimy, const int nmine);

/**
	\brief
	Procedure detruireGrille
	cette procedure detruit la grille de jeu
	\fn void detruireGrille(Grille *jeu)
	\param[in, out] jeu le jeu
	
 */
void detruireGrille(Grille * jeu);

/**
	\brief
	Procedure placeBombes
	cette procedure place de maniere aleatoire une bombe (mine) dans la grille
	\fn void placeBombes(Grille *jeu)
	\param [in, out] jeu le jeu
	
 */	
void placeBombes(Grille * jeu);

/**
	\brief 
	Procedure compteBombesVoisines
	cette procedure compte les bombes (mines) aux alentours d'une cellule (case) 
	\fn compteBombesVoisines(Grille *jeu)
	\param[in, out] jeu le jeu
 */
void compteBombesVoisines(Grille * jeu);

/**
	\brief
	Fonction calculCasesRestantes
	cette fonction retourne les cases (cellules) qui ne sont pas des mines (bombes)
	\fn int calculCasesRestantes(const Grille *jeu)
	\param[in, out] jeu le jeu
 */
int calculCasesRestantes(const Grille *jeu);

/**
	\brief 
	Procedure decouvrirZero
	Lorsque l'utilisateur clique sur un zero, cette procedure decouvre tous les zeros voisins ainsi que le contour de cette zone
	\fn void decouvrirZero(Grille *jeu, const int x, const int y)
	\param [in, out] jeu le jeu
	\param [in] x la position en x de la cellule zero
	\param [in] y la position en y de la cellule zero
 */
void decouvrirZero(Grille *jeu, const int x, const int y);

/**
	\brief
	Procedure : gestionDrapeau
	cette procedure place (ou retire) un drapeau dans le jeu
	\fn void gestionDrapeau(Grille *jeu, const int x, const int y)
	\param [in, out] jeu : le jeu
	\param [in] x : la position en x de la cellule ou poser(retirer) le drapeau
	\param [in] y : la position en y de la cellule
 */
void gestionDrapeau(Grille *jeu, const int x, const int y);

/**
	\brief
	Fonction : traitementGrille
	cette fonction decouvre la case voulue et renvoie le nombre de cases restantes si ce n'est pas une mine
	\fn int traitementGrille(Grille *jeu, const int x, const int y)
	\param [in, out] jeu : le jeu
	\param [in] x : la position en x de la cellule a traiter
	\param [in] y : la position en y de la cellule a traiter
	\return le nombre de case si l'utilisateur n'a pas clique sur une mine sinon -1 (MINE)
 */
int traitementGrille(Grille *jeu, const int x, const int y);

/**
	\brief
	Procedure decouvrirMines
	cette procedure decouvre les mines dans la grille pour afficher la reponse lorsque le joueur a perdu
	\fn decouvrirMines(Grille *jeu)
	\param [in, out] jeu le jeu
 */
void decouvrirMines(Grille *jeu);

#endif
